# MainShell/Process/DieTransfer/Planning ˵

## 1. Χ
˵ `MainShell/Process/DieTransfer/Planning` Ŀ¼µĹ滮ʵ֣ļ

- `DieTransferPathGenerator.cs`
- `DieTransferPlanningContext.cs`
- `DieTransferPathRequest.cs`
- `DieTransferPathPlan.cs`
- `DieTransferPathRegionPlan.cs`
- `DieTransferPathStep.cs`
- `DieTransferRegion.cs`
- `DieTransferRow.cs`
- `PadTransferRow.cs`
- `DieTransferRowDirection.cs`
- `SubstrateRowDirectionStrategy.cs`
- `IDieTransferPathGenerator.cs`

## 2. ģ鶨λ
ģ Die Transfer ġ滮㡱ְִ˶ǰѺѡ Die Ϻͺѡ Pad תһݿִе·ƻ

ฺṩ

- ѡ Die 
- ѡ Pad 
- Die 
- Substrate 
- ·ɲ
- Ƿ NG Die
- з

ฺṩ

- ɵԲ `Steps`
- ˺Ŀ Die / Pad 
- ʣδԵ Die / Pad
- ʣнṹ߽

Ǻģ滮߼˶ִнֶģʽԶ̣Ըͬһ·

## 3. Ķְ

### 3.1 `DieTransferPathRequest`
·滮

ؼֶΣ

- `DieCandidates`ѡ Die 
- `PadCandidates`ѡ Pad 
- `DieRegion`Die 
- `SubstrateRegion`Pad 
- `TransPathType`·ģʽ
- `SubstrateRowDirectionStrategy`Pad б
- `SkipNgDie`Ƿ NG Die

ĬֵñȽϺ

- Ĭģʽ `Sequence`
- Ĭ Pad з `AllPositive`
- Ĭ NG Die

### 3.2 `DieTransferPlanningContext`
ǵǰģĵмòǶⱩ¶ǰ request Ԥɡֱ·ڲġ

Ҫ£

1.  `RegionModel` תڲʹõ `DieTransferRegion`
2. ԭʼѡɰз `DieTransferRow` / `PadTransferRow`
3. з򣬰ÿһеĵ֯ȷ˳

仰˵ġ򡢹ˡ֯ generator  context ׶ɡ

### 3.3 `DieTransferPathGenerator`
·ڡ

ĸ

- `Generate()` `DieTransferPathPlan`
- `GenerateByRegion()` `DieTransferPathRegionPlan`
- `GenerateByCandidates()`ݴ Pad Ϻ Die  `DieTransferPathRegionPlan`
- `GenerateByRows()`ݴ `PadTransferRow` / `DieTransferRow` ֱ `DieTransferPathRegionPlan`

 `Generate()` ʵֻת `GenerateByRegion()`ֻǰѷխɻࡣˣ

- ÷ֻĲбͳϢ `Generate()` 
- ÷ʣ Die / Pad ʣӦʹ `GenerateByRegion()`

ڵĶλ£

- `GenerateByCandidates()`ʺϵ÷ֻԭʼѡ㼯ϣԼװ `DieTransferPathRequest` ĳ÷ڲԻе request/context Ԥ߼ɵ·ͳһӷؽ `Steps` лȡ
- `GenerateByRows()`ʺϵ÷Ѿɰз顢NG ˲õĳ÷¹ planning contextֱӰѴչΪ Die / Padɲʣ

### 3.4 `DieTransferPathPlan` / `DieTransferPathRegionPlan`
`DieTransferPathPlan` ʾ滮

- `TransPathType`
- `Steps`
- `AvailableDieCount`
- `AvailablePadCount`
- `GeneratedStepCount`

`DieTransferPathRegionPlan` ڴ˻չʣϢ

- `RemainingDies`
- `RemainingPads`
- `RemainingDieRows`
- `RemainingPadRows`
- `RemainingDieRegion`
- `RemainingSubstrateRegion`

ζŸģ鲻һ·ܸһּ滮ġ

### 3.5 `DieTransferPathStep`
Խ󣬼¼

-  `StepIndex`
- Die к
- Pad к
- ǰ·

ƵñȽֱӣ UI ִв㶼ѡ

## 4. ɷ
·ɵ£

1. ÷ `DieTransferPathRequest`
2. `DieTransferPathGenerator.GenerateByRegion()` У request ǿ
3. `DieTransferPlanningContext.Create(request)` ɹ滮
4.  context ȡ Die б Pad б
5.  `TransPathType` ѡɲ
6.  `DieTransferPathStep` б
7. δԵʣ Die / Pad
8. ʣнṹʣ
9. װ `DieTransferPathRegionPlan` 

԰Ϊʽ̣

- һΣԤ룬õȶ˳
- ڶΣ Die  Pad һһ

ڣֻǸı䡰㡱ı䡰·㷨

- `GenerateByCandidates()`ӺѡϽ룬ٸ `GenerateByRegion()` 
- `GenerateByRows()` request/context ֱӴжչΪ㼯ϺԽ׶

## 5. Ԥ׶ν

### 5.1 
`DieTransferPlanningContext.Create()` Ȱ `request.DieRegion`  `request.SubstrateRegion` ת `DieTransferRegion`

`DieTransferRegion.Contains(row, column)` жϵǷڡ

ǰ£

- Ϊգ
- ΪգΪˣкѡɲ滮

һʵģĵӿעȷ˵ΪһҵԼ

### 5.2 з
Pad  Die ֱ򣬶Ȱ `Row` 飬ÿһڲ

Pad ͨ `CreatePadRows()`  `PadTransferRow`

- ȹ˿ն
-  `Row` 
- ÿ鰴 `Column` 򱣴ԭʼ
- ٸݲԾǰնȡ

Die ͨ `CreateDieRows()`  `DieTransferRow`

- ȹ˿ն
-  `Row` 
- ÿ鰴 `Column` 򱣴
- з̶ηʽ
- `SkipNgDie` жЧ

### 5.3 з
Pad з `SubstrateRowDirectionStrategy` 

- `AllPositive`жСе
- `AllNegative`жӴеС
- `Serpentine`żз

Die зǰ̶ιΪ `CreateDieRows()` ʱ `useSerpentineDirection` ̶ `true`

- 
- żз

ζŵǰDie ı˳ Pad ǿԼ÷޷ request е Die з

### 5.4 õȡ
ڷɺcontext ͨ·չƽб

- `GetOrderedPads()`
- `GetOrderedDies()`

ᰴ `RowIndex` УƴÿеĿõС

 Die ġá `SkipNgDie` Ӱ죺

- `SkipNgDie = true` ʱ`DieStatus.Ng` ᱻų
- `SkipNgDie = false` ʱ Die 滮

ˣɵĲ request ԭʼѡϣǡˡNG ˺С

## 6. ɷ

### 6.1 ˳ `BuildSequenceSteps`
ֱӵĲԡ

ʽ

1. ȵõ `orderedDies`  `orderedPads`
2. ȡ `Math.Min(dies.Count, pads.Count)` Ϊɲ
3.  `i`  Die  `i`  Pad ֱ
4.  `CreateStep()` ɲ

α£

```text
stepCount = min(orderedDies.Count, orderedPads.Count)
for i in [0 .. stepCount - 1]
    step = CreateStep(i + 1, orderedDies[i], orderedPads[i])
    steps.Add(step)
```

òԵصǣ

- ȫԤ˳
- 㷨򵥣Ӷȵ
- ȶ׷
- ʵʼξ룬ֻźĶӦϵ

ó

- ĸ˳һ
- Ѿ֤ Die / Pad һһӦ
- ϣ·Ԥ⡢У͸

### 6.2  `BuildNearestSteps`
ǸƫŻĲԡ

ʽ

1. ȸһ `remainingDies`
2.  Pad ļȶ˳ÿ Pad
3. ڵǰʣ Die Уҳ Pad  Die
4. һԺ󣬰Ѹ Die  `remainingDies` Ƴ
5. һ Padֱ Die  Pad 

α£

```text
remainingDies = orderedDies
for each pad in orderedPads
    if remainingDies is empty
        break

    die = SelectNearestDie(pad, remainingDies)
    steps.Add(CreateStep(stepIndex, die, pad))
    remainingDies.Remove(die)
    stepIndex++
```

Բȫƥ䣬ǡ Pad ˳̰ѡ Die

ŵǣ

- ʵּ
- ԾֲƶŻ
- ȫ˳Ըռλ

Ҳȷ

- 㷨һȫŽ
- ǰ Pad ѡӰ Pad Ŀѡ Die
- ·̲һ

ˣԡ׼ȷıӦǣ

-  Pad ˳ִеľֲ̰ƥ

### 6.3  Die ѡȡ `SelectNearestDie`
`SelectNearestDie()` ǰʣ DieѡСǸ

ǰ㹫ʽΪ

```text
(die.X - pad.X)^2 + (die.Y - pad.Y)^2
```

ﷵصƽ룬ǿŷϾ롣ڡȽ˭⣬ƽǵȼ۵ģҼʡ

Ҫע㣺

1. `CalculateDistance()` ȷʵʸ `CalculateSquaredDistance()`
2. ʱǰ밴ȱ˭ͱ˭

ڶҪ

- ǰ tie-break ֱӰ `Row``Column` Ƚ
-  `remainingDies` ĵǰ˳
-  `remainingDies` ˳ Die е֯

Ҳ˵ Die ͬһ Pad Ⱦʱʤ߱ɡDie Ԥ˳򡱾

## 7. ʣɷʽ
·ɺ`GenerateByRegion()` һ㡰ʣ״̬ȡ

˵ʣɹֱǣ

- `GenerateByCandidates()` `GenerateByRegion()` ȫһ£Ϊڲװ request 
- `GenerateByRows()`÷же `RowIndex``Direction``SkipNgDie` мãֻ˵ʹõλٹ `RemainingPadRows` / `RemainingDieRows`

### 7.1 ʣ Die / Pad 
ͨ `CreateRemainingPads()`  `CreateRemainingDies()`

- ӲбȡѾʹù `(row, column)` 
- ԭ򼯺
- õδ뱾ֹ滮ĵ

ʹ `(row, column)` ΪΨһ˵ǰģĬһλΨһʶ

### 7.2 ʣнṹؽ
ʣ Pad / Die ֻǼ򵥷бɣ

- `RemainingPadRows`
- `RemainingDieRows`

ǳмֵΪҪι滮Ҫȫݽṹ

### 7.3 ʣؽ
`CreateRegionFromPads()`  `CreateRegionFromDies()` ʣ¼СΧ

- С
- С
- 
- 

ûʣ㣬򷵻 `null`

õ÷жϣ

- ǰǷȫ滮
- ʣһƬδ

## 8. Ľ

### 8.1 ŵ
ģŵȽȷ

- ְһרעڹ滮ִ
- request / context / result ṹ
- ˳ԺԱ߽ȷ
- ʣǿ˸
- ɶԽϺãչҲȽ

### 8.2 Ҫעĵ
ǰʵûԹȱݣмάע㣺

1. `CalculateDistance()` ʵƽ룬ע
2. Ǿֲ̰ģȫƥ䣬ĵȷ
3. Ⱦʱѡ Die Ԥ˳򣬽ȷд˵
4. `AvailableDieCount` / `AvailablePadCount` ʾ˺Ŀԭʼѡ
5. Ϊ `null` ʱʾˣʽԼ鲹˵
6. `Generate()` ػ࣬ʵڲɵƻ󣬵÷ȷԼǷҪʣϢ

### 8.3 ɸĽعĵ
ڣΪģ

- ǿдģͣڱⲿ޸ĵĿ
- `DieTransferPathGenerator` бδʹõ `OrderDies()` / `OrderPads()` ˽зں
- ռͳһʹ `MainShell.Process`Ŀ¼βȫһһӦϵǰֿ

## 9. ܽ
Planning ģĺ˼·ԸΪһ仰

ȰѺѡ Die / Pad зNG ȶ˳ٰ˳ԡ򡰾ֲ̰ԡ `DieTransferPathStep` б󲹳ʣʣϢ

ӿάԿʵѾ߱ϺõĻǰҪǰѲ彲ṹع㣬Ϊĵע͵Ĺ̶˵

- ģʽǾֲ̰ģȫ
- Ƚʹƽ
- Ⱦʱѭ Die ԤȺ˳
